package org.example.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Min;

/**
 * 创建短链接请求DTO
 * 用于接收前端传来的创建短链接请求参数
 * 包含数据验证注解，确保数据有效性
 * 
 * @author Your Name
 * @since 2024-07-01
 */
public class CreateShortUrlRequest {
    
    /**
     * 原始长链接，必填字段
     * 使用@NotBlank注解确保不能为空
     * 使用@Pattern注解和正则表达式确保是有效的URL格式
     */
    @NotBlank(message = "原始链接不能为空")  // 验证：字符串不能为空或只包含空白字符
    @Pattern(regexp = "^(https?://)?([\\w\\d.-]+\\.[\\w\\d.-]+)(:[0-9]+)?(/[\\w\\d%\\-._~:/?#\\[\\]@!\\$&'\\(\\)\\*\\+,;=]*)?$", message = "请输入有效的URL地址")  // 验证：必须是有效的URL格式，支持URL编码和查询参数
    private String originalUrl;
    
    /**
     * 过期天数，可选字段
     * 使用@Min注解确保如果填写了，必须大于0
     * 为null表示永不过期
     */
    @Min(value = 1, message = "过期天数必须大于0")  // 验证：如果填写了，必须大于等于1
    private Integer expireDays;
    
    /**
     * 自定义短链接编码，可选字段
     * 如果用户想要特定的短链接编码，可以在这里指定
     * 为null表示系统自动生成
     */
    private String customCode;
    
    // ==================== 构造函数 ====================
    
    /**
     * 无参构造函数
     * 用于JSON反序列化和框架创建对象
     */
    public CreateShortUrlRequest() {}
    
    /**
     * 带参构造函数
     * 用于快速创建只包含原始链接的请求对象
     * 
     * @param originalUrl 原始长链接
     */
    public CreateShortUrlRequest(String originalUrl) {
        this.originalUrl = originalUrl;
    }
    
    // ==================== Getter和Setter方法 ====================
    
    /**
     * 获取原始长链接
     * @return 原始长链接
     */
    public String getOriginalUrl() {
        return originalUrl;
    }
    
    /**
     * 设置原始长链接
     * @param originalUrl 原始长链接
     */
    public void setOriginalUrl(String originalUrl) {
        this.originalUrl = originalUrl;
    }
    
    /**
     * 获取过期天数
     * @return 过期天数，可能为null
     */
    public Integer getExpireDays() {
        return expireDays;
    }
    
    /**
     * 设置过期天数
     * @param expireDays 过期天数，可以为null表示永不过期
     */
    public void setExpireDays(Integer expireDays) {
        this.expireDays = expireDays;
    }
    
    /**
     * 获取自定义短链接编码
     * @return 自定义编码，可能为null
     */
    public String getCustomCode() {
        return customCode;
    }
    
    /**
     * 设置自定义短链接编码
     * @param customCode 自定义编码，可以为null表示系统自动生成
     */
    public void setCustomCode(String customCode) {
        this.customCode = customCode;
    }
}
